package model

import (
	"database/sql/driver"
	"encoding/json"
	"time"
)

type ToolVersion []string

func (t ToolVersion) Value() (driver.Value, error) {
	return json.Marshal(t)
}

func (t *ToolVersion) Scan(value interface{}) error {
	return json.Unmarshal(value.([]byte), &t)
}

// Item 项目
type Item struct {
	Id         uint   `json:"id" gorm:"primary_key;column:id"`
	Name       string `json:"name" gorm:"column:name"`
	NodeType   string `json:"nodeType" gorm:"column:node_type"`
	ParentID   uint   `json:"parentId" gorm:"column:parent_id;default:0;not null"`
	AppName    string `json:"appName" gorm:"column:app_name"`
	AppType    string `json:"appType" gorm:"column:app_type"`
	Env        string `json:"env" gorm:"column:env"`
	DeployType string `json:"deployType" gorm:"column:deploy_type"`
	Domain     string `json:"domain" gorm:"column:domain"`
	// 服务器部署参数
	DeployIps     string `json:"deployIps" gorm:"column:deploy_ips"`
	DeployDest    string `json:"deployDest" gorm:"column:deploy_dest"`
	RemoteCommand string `json:"remoteCommand" gorm:"column:remote_command"`
	// k8s部署参数
	DeployCluster string `json:"deployCluster" gorm:"column:deploy_cluster"`
	Namespace     string `json:"namespace" gorm:"column:namespace"`
	// 其他
	Time     time.Time       `json:"time" gorm:"column:time"`
	Meta     json.RawMessage `json:"meta" gorm:"type:json;column:meta"`
	Children []*Item         `json:"children" gorm:"-"`
}

// ItemVersion 项目版本
type ItemVersion struct {
	Id      uint   `json:"id" gorm:"primary_key"`
	Version string `json:"version" gorm:"column:version"`
	ItemId  uint   `json:"itemId" gorm:"column:item_id"`
	// 编译信息
	GitUrl          string      `json:"gitUrl" gorm:"column:git_url"`
	GitlabId        int         `json:"gitlabId" gorm:"column:gitlab_id"`
	GitCredentialId string      `json:"gitCredentialId" gorm:"column:git_credential_id"`
	ToolVersion     ToolVersion `json:"toolVersion" gorm:"type:json;column:tool_version"`
	//Tools          string      `json:"tools"`
	ExecDir        string `json:"execDir" gorm:"column:exec_dir"`
	CompileCommand string `json:"compileCommand" gorm:"column:compile_command"`
	Archive        string `json:"archive" gorm:"column:archive"`
	CusDockerfile  string `json:"cusDockerfile" gorm:"column:cus_dockerfile"`
	// 部署配置
	DeployConfig string    `json:"deployConfig" gorm:"column:deploy_config"`
	Time         time.Time `json:"time" gorm:"column:time"`
}

// FlowControl 流量控制
type FlowControl struct {
	Id           uint            `json:"id" gorm:"primary_key"`
	ItemId       uint            `json:"itemId" gorm:"column:item_id"`
	DefaultFlow  json.RawMessage `json:"defaultFlow" gorm:"column:default_flow"`
	AdvancedFlow json.RawMessage `json:"advancedFlow" gorm:"column:advanced_flow"`
}
